/**
 * Model package.
 */
package fr.umlv.m2.ig.model;

import java.util.Map;

import fr.umlv.m2.ig.model.event.SearchListener;
import fr.umlv.m2.ig.model.event.StationListener;
import fr.umlv.m2.ig.model.event.TrainListener;

/**
 * This interface defines the Beauheur model.
 * 
 * @author Gambouele Bertrand.
 * @author Viravout Alexandre.
 */
public interface BeauheurModel {
  
  /**
   * Adds a station listener.
   * 
   * @param stationListener a station listener.
   */
	public void addStationListener(StationListener stationListener);
	
	/**
	 * Removes a station listener.
	 * 
	 * @param stationListener a station listener.
	 */
	public void removeStationListener(StationListener stationListener);
	
	/**
	 * Adds a train listener.
	 * 
	 * @param trainListener s train listener.
	 */
	public void addTrainListener(TrainListener trainListener);
	
	/**
	 * Removes a train listener.
	 * 
	 * @param trainListener a train 
	 */
	public void removeTrainListener(TrainListener trainListener);
	
	/**
	 * Adds a search by line listener.
	 * 
	 * @param searchListener a search listener.
	 */
	public void addSearchByLineListener(SearchListener searchListener);
	
	/**
	 * Removes a search by line listener.
	 * 
	 * @param searchListener a search listener.
	 */
	public void removeSearchByLineListener(SearchListener searchListener);
  
  /**
   * Adds a search by name listener.
   * 
   * @param searchListener a search listener.
   */
  public void addSearchByNameListener(SearchListener searchListener);
  
  /**
   * Removes a search by name listener.
   * 
   * @param searchListener a search listener.
   */
  public void removeSearchByNameListener(SearchListener searchListener);
	
	/**
	 * Gets map width.
	 * 
	 * @return the width.
	 */
	public int getMapWidth();

	/**
	 * Gets map height.
	 * 
	 * @return the height.
	 */
	public int getMapHeight();
	
	/**
	 * Gets a station of rail network.
	 * 
	 * @param stationName name station to get.
	 * @return a station.
	 */
	public Station getStation(String stationName);
	
	/**
	 * Gets rail network stations.
	 * 
	 * @return stations.
	 */
	public Map<String, Station> getStations();
	
	/**
	 * Gets rail network lines.
	 * 
	 * @return lines.
	 */
	public Map<String, Line> getLines();
}
